package Buildings.net.server.parallel;
import Buildings.*;
import Buildings.dwelling.*;
import Buildings.office.*;
import Buildings.dwelling.hotel.*;
import Errors.*;
import Interfaces.*;
import java.io.*;
import java.net.*;
//import java.util.Random;

public class SerialServerParallel {
    private static class BinServerThread extends Thread{
        private Socket c;
        private ObjectInputStream in;
        private ObjectOutputStream out;
        
        private static double getCash(Building b)throws BuildingUnderArrestException{
        int value=(int)(Math.random()*10);
//        Random arest=new Random();
//        int value=arest.nextInt(10);
        if(value==1) throw new BuildingUnderArrestException();
        double s=0;
        int m[]=new int[]{1};
        Dwelling d=new Dwelling(1,m);
        OfficeBuilding o=new OfficeBuilding(1,m);
        Hotel h=new Hotel(1,m);
        if(b.getClass()==d.getClass()){
            s=b.getHowMuchAreaInBuilding()*1000;
        }
        if(b.getClass()==o.getClass()){
            s=b.getHowMuchAreaInBuilding()*1500;
        }
        if(b.getClass()==h.getClass()){
            s=b.getHowMuchAreaInBuilding()*2000;
        }
        return s;
    }
        public void run(){
            System.out.println("Серверное приложение - сериализация!");
            try{
                out=new ObjectOutputStream(c.getOutputStream());
                in=new ObjectInputStream(new BufferedInputStream(c.getInputStream()));
            }catch(IOException e){
                System.out.println("Ошибка создания-подключения к серверу!");
                System.exit(1);
            }
            
            Building example=null;
            Integer end=new Integer(-1);
            Object readed;
            double cash=0;
            do{
                try{
                    readed=in.readObject();
                    if(readed.getClass()==end.getClass()){
                        if(((Integer)readed).intValue()==end.intValue()){
                            System.out.println("Считана метка завершения");
                            break;
                        }
                    }
                    example=(Building)readed;
                    cash=getCash(example);
                    System.out.println("Общая цена здания "+cash);
                    Double g=new Double(cash);
                    out.writeObject(g);
                }catch (BuildingUnderArrestException e){
                    try{
                        out.writeObject(e);
                        System.out.println("Арестован");
                    }catch(IOException x){
                        
                    }
                }catch (IOException e) {
                    System.out.println("Ошибка ввода-вывода ");
                    break;
                }catch (ClassNotFoundException ex) {
                    System.out.println("Неизвестный класс ");
                }
            }while(true);
        
            try{ 
                in.close();
                out.close();
                c.close();
            }catch (IOException nx){
                System.out.println("Ошибка закрытия сокетов и потоков данных");
            }
        }
        public BinServerThread(Socket c){
            super("ServerThread");
            this.c=c;
            start();
        }
    }
    private static final int port=4500;
    public static void main(String arg[]){
        System.out.println("Многопточное серверное приложение - сериализация!");
        ServerSocket ss=null;
        try{
            ss=new ServerSocket(port);
        }catch(IOException CantCreateServer){
                System.out.println("Ошибка сервера по протоколу!");
                System.exit(1);
        }
        while(true){
            try{
                Socket client=ss.accept();
                new BinServerThread(client);
            }catch(IOException CantCreateServer){
                System.out.println("Ошибка создания потока сервера!");
                System.exit(1);
            }
        }
        
    }
}
